import type { Router, RouteLocationNormalized, NavigationGuardNext } from 'vue-router';
import { isAuthenticated, checkRoutePermission, logout } from '../utils/auth';
import { message } from 'ant-design-vue';
import NProgress from 'nprogress';

// 白名单路由（不需要认证）
const WHITE_LIST = ['/login', '/reg', '/404'];

// 权限检查
const checkPermission = (to: RouteLocationNormalized): boolean => {
  const meta = to.meta as any;
  
  // 白名单路由直接通过
  if (WHITE_LIST.includes(to.path)) {
    return true;
  }

  // 检查是否已登录
  if (!isAuthenticated()) {
    return false;
  }

  // 检查路由权限
  return checkRoutePermission(meta);
};

// 路由守卫
export const setupRouterGuards = (router: Router) => {
  // 前置守卫
  router.beforeEach(async (to: RouteLocationNormalized, _from: RouteLocationNormalized, next: NavigationGuardNext) => {
    NProgress.start();

    try {
      // 权限检查
      if (!checkPermission(to)) {
        if (!isAuthenticated()) {
          // 未登录，跳转到登录页
          message.warning('请先登录');
          next({
            path: '/login',
            query: { redirect: to.fullPath }
          });
          return;
        } else {
          // 已登录但无权限，跳转到403页面
          message.error('没有权限访问该页面');
          next('/403');
          return;
        }
      }

      // 检查是否需要刷新token
      await checkTokenExpiration();

      next();
    } catch (error) {
      console.error('路由守卫错误:', error);
      NProgress.done();
      next('/404');
    }
  });

  // 后置守卫
  router.afterEach((to: RouteLocationNormalized) => {
    NProgress.done();
    
    // 设置页面标题
    const title = to.meta?.title as string;
    if (title) {
      document.title = `${title} - 后台管理系统`;
    } else {
      document.title = '后台管理系统';
    }
  });

  // 错误处理
  router.onError((error) => {
    console.error('路由错误:', error);
    NProgress.done();
    message.error('页面加载失败，请刷新重试');
  });
};

// 检查token是否过期
const checkTokenExpiration = async (): Promise<void> => {
  const token = localStorage.getItem('token');
  if (!token) return;

  try {
    // 这里可以添加token过期检查逻辑
    // 例如：解析JWT token，检查过期时间
    // 或者发送请求到服务器验证token有效性
    
    // 示例：简单的token格式检查
    if (token.split('.').length !== 3) {
      throw new Error('Invalid token format');
    }
  } catch (error) {
    console.warn('Token验证失败:', error);
    logout();
    throw new Error('Token已过期，请重新登录');
  }
};

// 动态路由生成
export const generateRoutes = (userRoles: string[], userPermissions: string[]) => {
  // 这里可以根据用户角色和权限动态生成路由
  // 返回过滤后的路由配置
  
  const allRoutes = [
    {
      path: '/dashboard',
      name: 'dashboard',
      meta: {
        title: '仪表盘',
        icon: 'DashboardOutlined',
        requiresAuth: true,
        roles: ['admin', 'user']
      }
    },
    {
      path: '/users',
      name: 'users',
      meta: {
        title: '用户管理',
        icon: 'UserOutlined',
        requiresAuth: true,
        roles: ['admin'],
        permissions: ['user:read']
      }
    }
    // 更多路由配置...
  ];

  // 过滤用户有权限访问的路由
  return allRoutes.filter(route => {
    const meta = route.meta as any;
    
    // 检查角色权限
    if (meta.roles && !meta.roles.some((role: string) => userRoles.includes(role))) {
      return false;
    }
    
    // 检查权限
    if (meta.permissions && !meta.permissions.some((permission: string) => userPermissions.includes(permission))) {
      return false;
    }
    
    return true;
  });
};
